// 游戏对象
(function (window, undefined) {
  // 创建变量接收this，以便后期使用
  let that
  // 游戏类
  class Game {
    // 构造函数
    constructor(box) {
      // 舞台
      this.box = box
      // 创建食物和蛇实例
      this.food = new Food(this.box)
      this.snick = new Snick()
    }
    // 原型方法
    // 游戏初始化
    inIt() {
      this.food.render(this.box)
      this.snick.render(this.box)
      that = this
    }
    // 游戏运动方法
    move() {
      // 调用监听键盘函数
      keyDown()
      // 创建定时器，并把这个定时器交给游戏对象自己，这里没有使用箭头函数，因为外部已经定义了that使用that即可
      this.timer = setInterval(function () {
        // 调用食物和蛇的删除方法
        that.food.delete(that.box)
        that.snick.delete(that.box)
        // 调用蛇位置更新
        that.snick.upDate()
        // 调用判断吃到食物函数
        eat()
        //  调用蛇和食物的绘制方法
        that.food.render(that.box)
        that.snick.render(that.box)
        // 调用游戏结束检测函数
        gameOver()
      }, 100)
    }
  }
  // 功能：判断蛇是否吃到食物
  function eat() {
    //判断蛇头和食物位置是否重合，重合代表吃到食物
    if (that.food.x === that.snick.item[0].x && that.food.y === that.snick.item[0].y) {
      // 吃到食物调用食物的位置更新方法
      that.food.upDate()
      //创建一节蛇身
      const last = {}
      // 复制现有的最后一节蛇身
      Object.assign(last, that.snick.item[that.snick.item.length - 1])
      // 把新创建的蛇身添加进蛇的身体
      that.snick.item.push(last)
    }
  }
  // 功能：检测游戏是否结束
  function gameOver() {
    // 方法1:判断蛇头是否超出舞台
    // 获取蛇头允许再大的X和y值
    const maxX = that.box.clientWidth / that.snick.width
    const maxY = that.box.clientHeight / that.snick.height
    // 判断蛇头是否超出舞台
    if (that.snick.item[0].x < 0 || that.snick.item[0].x >= maxX || that.snick.item[0].y < 0 || that.snick.item[0].y >= maxY) {
      // 超出舞台删除定时器
      clearInterval(that.timer)
      //提示游戏结束
      alert('GAME OVER')
    }
    // 方法2:判断蛇头是否撞到蛇身
    // 遍历蛇身，除蛇头
    for (let i = 1, l = that.snick.item.length; i < l; i++) {
      // 判断蛇头是否和蛇身重合
      if (that.snick.item[0].x === that.snick.item[i].x && that.snick.item[0].y === that.snick.item[i].y) {
        // 一旦重合代表蛇头撞到蛇身
        clearInterval(that.timer)
        // 提示游戏结束
        alert('GAME OVER')
      }
    }
  }
  // 功能：给document添加键盘按下事件监听
  function keyDown() {
    // 键盘按下事件
    document.onkeydown = function (e) {
      // 获取现有的蛇头运动方向
      const direction = that.snick.direction
      // 兼容写法
      e = e || window.event
      // keycode 37 = Left ←
      // keycode 38 = Up ↑
      // keycode 39 = Right →
      // keycode 40 = Down ↓
      // 根据按下按键修改蛇头运动方向
      switch (e.keyCode) {
        case 37:
          if (direction !== 'left' && direction !== 'right') {
            that.snick.direction = 'left'
          }
          break;
        case 38:
          if (direction !== 'up' && direction !== 'down') {
            that.snick.direction = 'up'
          }
          break;
        case 39:
          if (direction !== 'left' && direction !== 'right') {
            that.snick.direction = 'right'
          }
          break;
        case 40:
          if (direction !== 'up' && direction !== 'down') {
            that.snick.direction = 'down'
          }
          break;
      }

    }
  }
  // game托管到window上
  window.Game = Game
})(window, undefined)